package br.edu.utfpr.servidor.util;

import br.edu.utfpr.comum.BackupDTO;
import br.edu.utfpr.comum.RetornoValidacao;
import br.edu.utfpr.comum.Stream;
import br.edu.utfpr.comum.md5.Hash;
import br.edu.utfpr.servidor.view.ServidorView;

import java.io.*;
import java.rmi.RemoteException;

public class ZipUtil{

    public static final String PREFIXO = "_backup";
    public static final String EXT = ".zip";

    /**
     * Recebe os bytes serializados vindos do cliente e grava na pasta 'repositorio'.
     *
     * @param stream
     * @param dto    return {@link RetornoValidacao}
     */
    public RetornoValidacao gravarArquivo(Stream stream, BackupDTO dto) {
        try {
            String fileName = dto.getOrigem().substring(dto.getOrigem().lastIndexOf("/"), dto.getOrigem().length()) + ZipUtil.PREFIXO + ZipUtil.EXT;
            FileOutputStream fos = new FileOutputStream(getDestino() + fileName);
            fos.write(stream.getBytes());
            fos.close();

            ServidorView.addLog("Recebido arquivo " + fileName);
            return new RetornoValidacao();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new RetornoValidacao("Ocorreu um erro no servidor");
    }

    /**
     * Metodo que pega o diretorio onde a aplicação esta rodando e cria uma pasta para servir de repositório
     *
     * @return caminho do diretorio
     * @throws RemoteException
     */
    public String getDestino() throws RemoteException {
        try {
            String caminho = new File(".").getCanonicalPath() + "/repositorio";
            File diretorio = new File(caminho);

            if (!diretorio.exists()) {
                diretorio.mkdirs();
            }

            return caminho;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public RetornoValidacao geraStream(BackupDTO dto) {

        try {
            String fileName = dto.getOrigem().substring(dto.getOrigem().lastIndexOf("/"), dto.getOrigem().length()) + ZipUtil.PREFIXO + ZipUtil.EXT;
            String caminho = getDestino() + fileName;
            File arquivo = new File(caminho);

            if(!arquivo.exists()){
                return new RetornoValidacao("Nenhum backup armazenado no servidor para :"+dto.getDescricao());
            }

            InputStream in = new FileInputStream(arquivo);
            Stream stream = new Stream(in);
            stream.setMd5(Hash.getMd5(arquivo));

            in.close();
            return  new RetornoValidacao(true,stream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return new RetornoValidacao("Ocorreu um erro ao fazer o restore no servidor");
    }

    public boolean possuiBackup(BackupDTO dto) throws RemoteException{
        String fileName = dto.getOrigem().substring(dto.getOrigem().lastIndexOf("/"), dto.getOrigem().length()) + ZipUtil.PREFIXO + ZipUtil.EXT;
        String caminho = getDestino() + fileName;
        File arquivo = new File(caminho);

        return  arquivo.exists();
    }

    public void addLog(String str){
        ServidorView.addLog(str);
    }
}
